#include <iostream>
#include <cstdio>
#include <vector>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <functional>

void handler(int signal)
{
    std::cout << "parent get signal:" << signal << std::endl;
    std:: cout << "i am father quit" << std::endl;
    exit(1);
}

int main()
{
    signal(SIGCHLD, SIG_IGN);
    for(int i=0; i<10; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            sleep(1);
            int cnt = 5;
            while(cnt--)
                std::cout << "i am child :" << i << std::endl;

            exit(1);
        }
    }
    while(true) ;

    return 0;
}



//int main()
//{
//    signal(17,handler);
//    pid_t id = fork();
//    if(id == 0)
//    {
//        std:: cout << "i am father quit" << std::endl;
//        exit(1);
//    }
//    while(true) ;
//
//    return 0;
//}
//


//volatile int flag = 0;
//void handler(int signal)
//{
//    std::cout << "更改全局变量flag" << flag << 1 << std::endl;
//    flag = 1;
//}
//
//// volatile
//int main()
//{
//    signal(2, handler);
//
//    while(!flag) ;
//    std::cout << "process end!" << std::endl;
//
//    return 0;
//}


//void handler(int sig)
//{
//    std::cout << "signal: " << signal << std::endl;
//    while(true)
//    {
//        sigset_t pending;
//        sigpending(&pending);
//        for(int i = 31; i>= 1; i--)
//        {
//            if(sigismember(&pending, i))
//                std::cout << 1;
//            else
//                std::cout << 0;
//        }
//        std::cout << std::endl;
//        sleep(1);
//    }
//}
//
//
//int main()
//{
//    struct sigaction act, oldact;
//    act.sa_flags  = 0;
//    act.sa_handler = handler;
//
//    // 设置其他想屏蔽的信号
//    sigemptyset(&act.sa_mask);
//    sigaddset(&act.sa_mask, 1);
//    sigaddset(&act.sa_mask, 3);
//
//    // 自定义捕捉2号信号
//    sigaction(2, &act, &oldact);
//
//    while(true)
//    {
//        std::cout << "." << getpid() <<  std::endl;
//        sleep(1);
//    }
//    return 0;
//}




//void Printpending()
//{
//    sigset_t pending;
//    sigemptyset(&pending);
//
//    int n = sigpending(&pending);
//    if (n < 0)
//    {
//        perror("sigpending");
//        exit(1);
//    }
//
//    for (int signo = 31; signo >= 1; signo--)
//    {
//        if (sigismember(&pending, signo))
//            std::cout << 1;
//        else
//            std::cout << 0;
//    }
//
//    std::cout << std::endl;
//}
//
//void handler(int signal)
//{
//    std::cout <<"////////////////////////////////////" << std::endl;
//
//    std::cout <<signal << "信号递达" << std::endl;
//    Printpending();
//
//    std::cout <<"////////////////////////////////////" << std::endl;
//    sleep(1);
//}
//
//int main()
//{
//    // 0.自定义捕捉2号信号
//    signal(2, handler);
//
//    // 1.初始化信号集，并初始化为全0
//    sigset_t set, oldset;
//    sigemptyset(&set);
//    sigemptyset(&set);
//
//    // 1.5 屏蔽2号信号
//    sigaddset(&set, 2);
//
//    // 2.设置信号屏蔽字
//    sigprocmask(SIG_SETMASK, &set, &oldset);
//
//    // 3.获取pending表内容
//    int cnt = 0;
//    while (true)
//    {
//        Printpending();
//        if(cnt == 10)
//        {
//            // 接触对2号信号的屏蔽
//            std::cout << "接触对2号信号的屏蔽" << std::endl;
//            sigprocmask(SIG_SETMASK, &oldset, nullptr);
//            Printpending();
//        }
//
//        sleep(1);
//        cnt++;
//    }
//
//    return 0;
//}

// int main()
//{
//     sigset_t bit;
//     sighandler_t f();
//     SIG_DFL;
//     struct sighand_struct;
//     return 0;
// }

// Core Term
// int main()
//{
//    //pid_t id = fork();
//    //if(id == 0)
//    //{
//    //    int a = 10;
//    //    a /= 0;
//    //}
//    //int status = 0;
//    //waitpid(id, &status, 0);
//    //printf("exit code:%d, exit signal:%d, core dump:%d\n", (status>>8)&0xFF, (status)&0x7F, (status>>7)&0x1);
//
//
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    int a = 10;
//    a /= 0;
//    //int *p = nullptr;
//    //*p = 100;
//
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    printf("hello world\n");
//    return 0;
//}
//
//////////////funcs/////////////
// void Sched()
//{
//     std::cout << "我是进程调度" << std::endl;
// }
//
// void Manager()
//{
//     std::cout << "内存管理" << std::endl;
// }
//
// void Fflush()
//{
//     std::cout << "我是刷新程序，定期刷新内存到磁盘" << std::endl;
// }
//////////////funcs////////////
//
//
//// 利用包装器包装返回值为void没有参数的方法
// using func_t = std::function<void()>;
//
//// 利用容器将所有的方法存储起来
// std::vector<func_t> funcs;
//
// void handler(int signal)
//{
//     // 执行方法
//     for(int i=0; i<funcs.size(); ++i)
//         funcs[i]();
//
//     // 重新设定闹钟
//     alarm(2);
// }
//
// int main()
//{
//     // 注册方法
//     funcs.emplace_back(Sched);
//     funcs.emplace_back(Manager);
//     funcs.emplace_back(Fflush);
//
//
//     // 自定义捕捉闹钟
//     signal(SIGALRM, handler);
//
//     // 设置闹钟
//     alarm(1);
//
//     // 让进程一直处于暂停，直到闹钟响了，跳转闹钟的自定义捕获函数处
//     while (true)
//     {
//         pause();
//     }
//     return 0;
// }

// int cnt = 0;
//
// void handler(int signal)
//{
//     std::cout << "我是" << signal << "号信号" << std::endl;
//     std::cout << cnt << std::endl;
//     exit(12);
// }
//
// int main()
//{
//     signal(SIGALRM, handler);
//     alarm(3);
//
//     while (true)
//     {
//         //std::cout << "." << cnt++ << std::endl;
//         cnt++;
//     }
//
//     return 0;
// }
//
//  int main()
//{
//      // 自定义捕捉所有可以被自定义捕捉的信号
//      for(int i=1; i<32; i++)
//          signal(i, handler);
//
//      int *p = nullptr;
//      *p = 100;
//      //int a = 10;
//      //a /= 0;
//      return 0;
//  }

// abort();
// int main1()
//{
//    signal(6, handler);
//    //for (int i = 1; i < 32; i++)
//    //    signal(i, handler);
//
//    int cnt = 1;
//    while (true)
//    {
//        std::cout << "pid:" << getpid() << std::endl;
//        sleep(1);
//        abort();
//        //raise(cnt++);
//        //for (int i = 1; i < 32; i++)
//        //    if (i != 9 && i != 19)
//        //        kill(getpid(), i);
//    }
//    return 0;
//}

// void handler(int signal)
//{
//     std::cout << "我是" << signal << "号信号" << std::endl;
// }
//
// int main()
//{
//     // 自定义捕捉所有的普通信号
//     for(int i=1; i<32; ++i)
//         signal(i, handler);
//
//     while(true)
//     {
//         sleep(1);
//         std::cout << "pid : " << getpid() << std::endl;
//     }
//
//     return 0;
// }
//

// 测试前后台进程切换
// void handler(int signal) { std::cout << "我是" << signal << "信号" << std::endl; }
// int main()
//{
//    signal(SIGINT, handler);
//    while (true)
//    {
//        std::cout << "pid:" << getpid() << std::endl;
//        sleep(1);
//    }
//    return 0;
//}

// 父子进程同属于一个进程组，一个终端只能有一个前台进程组
// int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        //child
//        while(true)
//        {
//            sleep(1);
//            std::cout << "i am child pid:" << getpid() << std::endl;
//        }
//    }
//    else
//    {
//        while(true)
//        {
//            sleep(1);
//            std::cout << "i am father pid:" <<getpid() <<std::endl;
//        }
//    }
//    return 0;
//}

// void handler(int signal) { std::cout << "我是" << signal << "信号" << std::endl; }
// int main()
//{
//     signal(SIGINT, handler);
//     while (true)
//     {
//         std::cout << "pid:" << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main()
//{
//     while(true)
//     {
//         sleep(1);
//         std::cout << "pid: " << getpid() << std::endl;
//     }
//     return 0;
// }